package com.lujianfei.ann;

import com.lujianfei.ann.ui.MainFrame;

public class Main {

	public static void main(String[] args) {
//		int input_node = 32; // 32 位二进制表示一个数
//		int hide1_node = 15;
//		int out_node = 4;    // 4 个分类结果
//		double rate = 0.05;
//		
//		AnnNetwork network = new AnnNetwork();
//		network.setRate(rate);
//		
//		network.addLayer(new Layer.Builder(input_node).setOutWeight(new Weight(input_node, hide1_node)).setActivateFunc(new Sigmoid()).create());
//		
//		network.addLayer(new Layer.Builder(hide1_node).setOutWeight(new Weight(hide1_node, out_node)).setActivateFunc(new Sigmoid()).create());
//		
//		network.addLayer(new Layer.Builder(out_node).setActivateFunc(new Sigmoid()).create());
//		
//		network.init();
//		
//		Random random = new Random();
//
//		List<Integer> trainDatas = new ArrayList<Integer>();
//		for (int i = 0; i != 6000; i++) { //随机生成6000个训练数据
//			int value = random.nextInt();
//			trainDatas.add(value);
//		}
//		LogUtils.forcePrintln("开始训练...");
//
//		
//		for (int trainCount = 0; trainCount != 100; trainCount++) {
//			double totalErrors = 0;
//			for (int sample=0; sample < trainDatas.size(); sample++) {
//				int value = trainDatas.get(sample);
//				//获取目标值
//				double[] labels = getLabels(value);
//				//将训练数据转换为二进制
//				double[] bTrainDatas = intToBinary(value);
//				//训练并获取误差的平方
//				totalErrors += network.train(bTrainDatas, labels);
//			}
//			LogUtils.forcePrintln(String.format("第%s次训练的均方差:%s", trainCount + 1,totalErrors / (double)trainDatas.size()));
//		}
//		
//		LogUtils.forcePrintln("Object-Oriencted训练完毕，开始测试，神经网络将自动判断它是正数还是复数，奇数还是偶数。");
//		
//		Integer[] testData = new Integer[] {-1,-2,-3,-4,-5, 1, 2, 3, 4, 5};
//		for (Integer value : testData) {
//			int rawVal = value;
//			
//			//将待判断值转成二进制
//			double[] binary =intToBinary(value);
//
//			double[] result = new double[4];
//			
//			//开始使用神经网络判断结果
//			network.predict(binary,result);
//			
//			int idx = resultToIdx(result);
//
//			switch (idx) {
//			case 0:
//				System.out.format("%d是一个正奇数\n", rawVal);
//				break;
//			case 1:
//				System.out.format("%d是一个正偶数\n", rawVal);
//				break;
//			case 2:
//				System.out.format("%d是一个负奇数\n", rawVal);
//				break;
//			case 3:
//				System.out.format("%d是一个负偶数\n", rawVal);
//				break;
//			}
//		}
		new MainFrame();
	}
	private static int resultToIdx(double[] result) {
		double max = -Integer.MIN_VALUE;
		int idx = -1;

		for (int i = 0; i != result.length; i++) {
			if (result[i] > max) {
				max = result[i];
				idx = i;
			}
		}
		return idx;
	}

	private static double[] intToBinary(int value) {
		double[] binary = new double[32];
		int index = 31;
		do {
			binary[index--] = (value & 1);
			value >>>= 1;
		} while (value != 0);
		return binary;
	}

	private static double[] getLabels(int value) {
		double[] real = new double[4];
		if (value >= 0) {
			if ((value & 1) == 1) {
				real[0] = 1;
			}else {
				real[1] = 1;
			}
		} else if ((value & 1) == 1) {
			real[2] = 1;
		} else {
			real[3] = 1;
		}
		return real;
	}
}
